home *** CD-ROM | disk | FTP | other *** search
/ Qoole for Quake / Qoole for Quake (USA).7z / Qoole for Quake (USA).bin / Specs / qmapspec.txt < prev   
Text File  |  1997-09-01  |  52KB  |  1,374 lines

  1.                                Quake MAP Specs
  2.  
  3.    Last Updated: 10/27/96 10:43PM EST *NOTE THIS IS A DRAFT VERSION AND IS
  4.                                 UNFINISHED*
  5.  
  6.       Info on entities/maps and maintenance by Niklata (Nicholas Kain)
  7.              Additions and original HTMLization by Thomas Winzig
  8.  
  9. Here are the MAP file specs. This document should tell you everything you
  10. need to know about MAP files. This should help you in making
  11. editors/building MAP files. If you find an error, or figure something out
  12. that I don't know, please email Niklata. I'll put in your contribution and
  13. you'll get your name in here as well.
  14.  
  15. This document is now a part of the Unoffical Quake Specs. This standalone
  16. version is here to provide you with the most up-to-date information about
  17. Quake Map Editing. It is also a part of the Quake Documentation Project.
  18.  
  19. Since map editing is quite untested, a great deal of new information is
  20. pouring in about editing Quake levels. Not everything is here yet. I
  21. frequently update the seperate Map Specs and you can get the latest version
  22. from Quake Technical Resources. Hopefully when editing becomes more
  23. mainstream and the rate of new discoveries comes to a near stop, I won't
  24. have to tell you about (or maintain) the standalone file.
  25.  
  26. You can get the most up-to-date version of the Quake MAP Specs from Quake
  27. Technical Resources. If you place a link to the Quake Map Specs on your
  28. webpage, I would strongly request that you also place a link to Quake
  29. Technical Resources.
  30.  
  31. ----------------------------------------------------------------------------
  32.  
  33.                               Table of Contents
  34.  
  35. Section 1: MAP Information
  36. 1.1: Coordinate System
  37. 1.2: Brushes
  38. 1.3: Map Structure
  39.  
  40. Section 2: Entity Information
  41. 2.1: Entity Overview
  42. 2.2: Flags and Spawnflags Key
  43. 2.3: Optional parameters for triggers
  44. 2.4: General entity syntax
  45. 2.5: General entity list
  46.  
  47. Section 3: Entity classname examples
  48. 3.1: Lights
  49. 3.2: Player movement keys
  50. 3.3: Movers (Doors, plats, etc)
  51. 3.4: Triggers/Switches
  52. 3.5: Traps/Things harmful to you
  53. 3.6: Miscellaneous
  54.  
  55. Section 4: Special entity-related structures
  56. 4.1: Moving platforms
  57. 4.2: Monsters and triggers
  58. 4.3: How to use trigger_count
  59. 4.4: Teleporting monsters
  60. 4.5: Properties of Buttons
  61. 4.6: Including predefined models
  62.  
  63. Appendix A: Algorithms and Code examples
  64. A.1: Introduction and overview
  65.  
  66. Appendix B: Glossary
  67.  
  68. ----------------------------------------------------------------------------
  69.  
  70. What's New
  71.  
  72. Fixed flag tags.
  73.  
  74. Contributors to the Map Section
  75.  
  76. Thomas Winzig - Confirmation on the model; key's behavior. HTMLization of
  77. original Map Specs doc. Clarified several things. Reorganized the document
  78. structure a little bit.
  79. Brian Hackert - Info on how to use func_train and path_corner. Told me that
  80. targetname and target can have real names for their argument, not just
  81. numbers.
  82. Remco Stoffer - trigger_counter info, light styles, trap_shooter, some
  83. trigger_relay info, teleporting monsters, shootable buttons, and lots of
  84. other stuff.
  85. Thomas Scherning - Information on the last five brush parameters.
  86. Lars Bensmann - Information on using origin with attached brushes, a few
  87. bugfixes.
  88. Robert Jones - Info on using light key with fires, list of light styles.
  89. Marc Fontaine - Correcting the Y-axis in the coord system.
  90. Bernd Kreimeier - Correcting rot_angle and texture offsets.
  91. Ben Morris - Correcting right/left handed system.
  92. Dalias - Correcting several errors in section 2.2.3. Use of model tag in map
  93. files.
  94. Denis Moeller - List of entites and their keys/flags, difficulty flags,
  95. several fixes.
  96. Martin Fuchs - Several fixes/additions.
  97.  
  98.                          Section 1: MAP Information
  99.  
  100. 2.1.1 Coordinate System:
  101.  
  102. Quake uses a standard right-handed (X,Y,Z) coordinate system. If you're not
  103. familiar with the reference of "right-handed" to a coordinate system, it
  104. basically provides a tactile and visual discription of the mechanics of the
  105. system. If you point your fingers towards the positive x-axis and bend your
  106. fingers so that your knuckles face the positive y-axis, your thumb will
  107. point towards the positive z-axis:
  108.  
  109.         ^ z+
  110.         |
  111.         |
  112.         |
  113.         |
  114.         |------------> y+
  115.        /
  116.       /
  117.      /
  118.     /
  119.  
  120.  
  121. Some entities also need to have an angle key that tells the direction it is
  122. facing. All angles in Quake are represented using degrees for measurement.
  123. The possible values are listed below:
  124.  
  125. 1-360: Normal Angle (360 == east)
  126. -1: Up
  127. -2: Down
  128.  
  129. 2.1.2 Brushes:
  130.  
  131. Brushes are one of the two primary components of a MAP file. Each brush
  132. defines a solid region. Brushes define this region as the intersection of
  133. four or more planes. Each plane is defined by three noncolinear points.
  134. These points must go in a clockwise orientation:
  135.  
  136. 1--2----------------->
  137. |
  138. 3
  139. |
  140. |
  141. |
  142. |
  143. |
  144. ,
  145.  
  146. Each brush statement looks like this:
  147.  
  148.  {
  149.   ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0
  150.   ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) GROUND1_6 0 0 0 1.0 1.0
  151.   ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) GROUND1_6 0 0 0 1.0 1.0
  152.   ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) GROUND1_6 0 0 0 1.0 1.0
  153.   ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) GROUND1_6 0 0 0 1.0 1.0
  154.   ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 ) GROUND1_6 0 0 0 1.0 1.0
  155.  }
  156.  
  157. That's probably just a bit confusing when you first see it. It defines a
  158. rectangular region that extends from (128,128,64) to (256,384,128). Here's
  159. what a single line means:
  160.  
  161.   ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0
  162.    1st Point   2nd Point   3rd Point   Texture
  163.  
  164.  
  165. Now, you're probably wondering what those last five numbers are. I've listed
  166. what they do below:
  167.  
  168. x_off     - Texture x-offset
  169. y_off     - Texture y-offset
  170. rot_angle - floating point value indicating texture rotation
  171. x_scale   - scales x-dimension of texture (negative value to flip)
  172. y_scale   - scales y-dimension of texture (negative value to flip)
  173.  
  174. 2.1.3 General MAP Info:
  175.  
  176. The actual MAP file format is quite simple. It is simply a text file. All
  177. Quake editing tools should support either UNIX or DOS text formats, as id's
  178. tools do.
  179.  
  180. MAP files are the development format for Quake levels. It is preferred that
  181. all editors work with MAP files, as all tools released by id Software also
  182. use the MAP file format. A map file is basically un-'compiled' level data.
  183. The actual MAP file is totally unusable by Quake itself until it is coverted
  184. to a BSP file by a BSP builder such as id Software's QBSP. For a MAP file's
  185. lightmaps to be calculated by Quake, the level must also be run through a
  186. light builder, such as LIGHT. Otherwise, everything will be displayed at
  187. full brightness. Finally, to speed up the level and ensure proper display,
  188. visibility lists should be calculated by a program such as VIS. The process
  189. for building levels in Quake is quite time-consuming compared to building
  190. Doom levels, even on a fast computer.
  191.  
  192. The generalized format for a MAP file is as follows:
  193.  
  194. {
  195.  entity
  196.  {
  197.   brush (optional)
  198.  }
  199. }
  200. ...
  201.  
  202. Comments in the MAP file are indicated by a "//" (C++ style comment).
  203.  
  204. Many entity/brush combinations can be put into a map file. All MAP files
  205. must contain with a worldspawn entity, usually as the first entry. This
  206. entry defines all of the normal brushes that make up the structure of the
  207. level. There should be only one worldspawn entity per MAP file. Here's the
  208. syntax of the worldspawn class:
  209.  
  210. "classname" "worldspawn" // Tells Quake to spawn the world
  211. "wad" "DIRPATH"          // tells what graphics (texture) WAD2 file to use.
  212. "message" "TITLE"        // The title of the level
  213. "worldtype" "#"          // Describes time of environment (changes appearance/name of keys)
  214.                          // 0 == Medieval (medieval)
  215.                          // 1 == Runic (metal)
  216.                          // 2 == Present (base)
  217. "sounds" "#"             // Tells the CD player which track to play.
  218. "light" "#"              // Default light level
  219.  
  220. A simple map file would look like this:
  221.  
  222. {
  223.  "sounds" "1"
  224.  "classname" "worldspawn"
  225.  "wad" "/gfx/base.wad"
  226.  "worldtype" "0"
  227.  {
  228.   ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0
  229.   ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) GROUND1_6 0 0 0 1.0 1.0
  230.   ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) GROUND1_6 0 0 0 1.0 1.0
  231.   ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) GROUND1_6 0 0 0 1.0 1.0
  232.   ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) GROUND1_6 0 0 0 1.0 1.0
  233.   ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 ) GROUND1_6 0 0 0 1.0 1.0
  234.  }
  235. }
  236. {
  237.  "classname" "info_player_start"
  238.  "origin" "256 384 160"
  239. }
  240.  
  241. As you can see, all brushes are contained in entities, even those that make
  242. up the main level. The most complex part of MAP files are the entities. They
  243. are what the rest of this document are about.
  244.  
  245.                         Section 2: Entity information
  246.  
  247. 2.2.1 Entity Overview:
  248.  
  249. Entities are the second major component of Quake MAP files. An entity is
  250. basically a bit like a thing, but they also function as triggers and as
  251. pathmarkers. A entity statement looks like this:
  252.  
  253. {
  254.  "classname" "light"
  255.  "origin" "0 128 64"
  256.  "light" "255"
  257. }
  258.  
  259. This is what is called a general entity statement. It is called a general
  260. statement because it does not attach to a brush. An attached entity
  261. statement looks like this:
  262.  
  263. {
  264.  "classname" "func_door"
  265.  "angle" "0"
  266.  "speed" "16"
  267.  "targetname" "t1"
  268.  "sounds" "1"
  269.  "wait" "16"
  270.   {
  271.    ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0
  272.    ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) GROUND1_6 0 0 0 1.0 1.0
  273.    ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) GROUND1_6 0 0 0 1.0 1.0
  274.    ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) GROUND1_6 0 0 0 1.0 1.0
  275.    ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) GROUND1_6 0 0 0 1.0 1.0
  276.    ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 ) GROUND1_6 0 0 0 1.0 1.0
  277.   }
  278. }
  279.  
  280. Attached entity brushes can have an "origin" key. It can be used to offset
  281. where they appear in the level.
  282.  
  283. For the rest of the document, when I give you frameworks for a structure,
  284. the individual entries can be in any order, and lots are optional. I try to
  285. mark if an entry is optional, although this has not yet been rigorously
  286. tested.
  287.  
  288. In a "" block, your choices for that block are delimited by commas.
  289.  
  290. 2.2.2 Flags and Spawnflags Key:
  291.  
  292. The spawnflags change the default behavior of an entity. They can be set
  293. manually using a spawnflags key, or by using flags in the entity. Values can
  294. be combined by addition or bitwise or (really the same thing). Spawnflags
  295. are also automatically manipulated when you use a flag parameter within the
  296. entity. This only has an effect at the progs level though.
  297.  
  298. ** UNDER CONSTRUCTION **
  299.  
  300. General flags/values:
  301.  
  302. 256                  - Does not appear if skill == 0 (easy)
  303. 512                  - Does not appear if skill == 1 (medium)
  304. 1024                 - Does not appear if skill == 2 (hard and nightmare)
  305. 1792                 - Does not appear if skill == 0, 1, 2 (deathmatch games only)
  306. 2048                 - Does not appear if deathmatch != 0 (in deathmatch games)
  307.  
  308. ammo items:
  309. "big"            (1) - Doubles amount of ammo in box
  310.  
  311. monsters:
  312. "ambush"         (1) - Monster only wakes up on sight
  313.  
  314. func_episodegate:
  315. "e1"                 - Appears if player has Episode 1 sigil
  316. "e2"                 - Appears if player has Episode 2 sigil
  317. "e3"                 - Appears if player has Episode 3 sigil
  318. "e4"                 - Appears if player has Episode 4 sigil
  319.  
  320. func_door:
  321. "toggle"         (1) -
  322. "start_open"     (2) -
  323. "door_dont_link" (4) -
  324. "gold_key"       (8) -
  325. "silver_key"    (16) -
  326.  
  327. item_health:
  328. "rotten"         (1) - Gives 10HP
  329. "megahealth"     (2) - Gives 100HP, then slowly decrease to max health limit
  330.  
  331. item_sigil:
  332. "e1"                 - Sigil for Episode 1
  333. "e2"                 - Sigil for Episode 2
  334. "e3"                 - Sigil for Episode 3
  335. "e4"                 - Sigil for Episode 4
  336.  
  337. monster_zombie:
  338. "crucified"      (1) - Crucified Zombie
  339.  
  340. trigger_teleport:
  341. "silent"         (2) -
  342.  
  343. 2.2.3 General Entity syntax:
  344.  
  345. (Thanks to John Wakelin who wrote much of this section)
  346.  
  347. The entities define the monsters, things, but also the positions in space
  348. where something must happen, so they are the Quake equivalent of both the
  349. THINGS and the LINEDEF types from DOOM.
  350.  
  351. The entity definitions are made up of a series of specific details (called
  352. keys) that define what each is, where it starts, when it appears etc. Each
  353. key is followed by a modifier that arguments it. A key that does not have an
  354. argument is called a flag. Its presence alters the behavior of the entity
  355. that contains it. Flags are usually only work with certain entity classes.
  356. All definitions have the classname key that identifies that entity. The
  357. classname keys relate intimately with the code lump and are the names of
  358. functions written in Quake C.
  359.  
  360. Key                 Args                       Description
  361. --------------------------------------------------------------------------------
  362. "classname"  "name"    // Type of entity to be defined (mandatory)
  363. "origin"     "X Y Z"   // Coordinates of where it starts in space.
  364. "angle"      "#"       // Direction it faces or moves (sometimes in degrees)
  365. "light"      "#"       // Used with the light classname.
  366. "target"     "t#"      // Matches a targetname.
  367. "targetname" "t#"      // Like a linedef key.
  368. "killtarget" "#"       // Removes target when triggered?
  369. "spawnflags" "#"       // Used to flag/describe an entity that is not default.
  370. "style"      "#"       // Used to flag/describe an entity that is not default.
  371. "message"    "string"  // Message displayed when triggered (\n for linebreaks)
  372. "mangle"     "X Y Z"   // Point where the intermission camera looks at
  373.  
  374. {MODEL INFO}           // In entities that describe triggers/doors/platforms, etc,
  375.                        // the model info is inserted into the entity brackets,
  376.                        // delimited by another set of brackets.  The model key
  377.                        // may be used in place of an inline model declaration.
  378.  
  379. "model"     "*#"       // Defines the model contained within the brush
  380.  
  381. specifics/args present only in models:
  382.  
  383. "speed"      "#"          // How fast the model is moved.
  384. "wait"       "#"          // How long a pause between completion of movement or
  385.                           // return to original position (in seconds or 10ths)
  386. "lip"        "#"          // Amount a button/door sticks out when activated.
  387. "dmg"        "#"          // How much damage the model causes when it shuts on you?
  388. "health"     "#"          // How much damage the model takes before it triggers
  389. "delay"      "#"          // Time before event is triggered
  390. "sounds"     "#"          // Sound entity makes when triggered/spawned
  391. "wad"        "wadfile"    // The wad2 graphics file used by the world for textures.
  392. "height"     "#"          // How high a platform will raise
  393.  
  394. ---------------------------------------------------------------------------------
  395. {
  396.     "key1" "arg1"      // The first descriptors (usually classname)
  397.     "key2" "arg2"      // The second
  398.     ...                // Etc...
  399.  
  400.     {
  401.         <INSERT MODEL INFO HERE>     // for entities like doors/triggers/platforms/etc
  402.     }
  403. }
  404.  
  405. Note: The term model refers to a combination of a brush and an entity. One
  406. or more brushes are bound to an entity, which controls the behavior of the
  407. brushes. All brushes are contained within models.
  408.  
  409. The model numbers in the compiled BSP (*x) comes from the order in which the
  410. models are stored in the models structure. These numbers are originally
  411. derived from the order of the models in the source MAP file.
  412.  
  413. The worldspawn model is a bounding box that defines the extents of the whole
  414. world. There should only be one worldspawn model per map.
  415.  
  416. The models are defined by a bounding box of the max and min(x,y,z).
  417. Therefore they are always parallel to the horizontal planes. This bounding
  418. box is simply used for speeding up collision detection and will not affect
  419. the movement of the models themselves.
  420.  
  421. 2.2.4 All known entities (current for Registered Quake 1.01):
  422.  
  423. air_bubbles                   : Rising bubbles
  424.  
  425. ambient_comp_hum              : Computer background sounds
  426. ambient_drip                  : Dripping sound
  427. ambient_drone                 : Engine/machinery sound
  428. ambient_fluoro_buzz           : Flourescent buzzing sound
  429. ambient_light_buzz            : Buzzing sound from light
  430. ambient_suck_wind             : Wind sound
  431. ambient_swamp1                : Frogs croaking
  432. ambient_swamp2                : Slightly different sounding frogs croaking
  433. ambient_thunder               : Thunder sound
  434.  
  435. event_lightning               : Lightning (Used to kill Cthon, shareware boss)
  436.  
  437. func_bossgate                 : Entity appears unless player has all four sigils
  438. func_button                   : A button
  439. func_dm_only                  : A teleporter that only appears in deathmatch
  440. func_door                     : Door
  441. func_door_secret              : A door that is triggered to open
  442. func_episodegate              : Entity appears if player has appropriate episode sigil
  443. func_illusionary              : Creates brush that appears solid, but isn't
  444. func_plat                     : A lift/elevator
  445. func_train                    : A platform (moves along a "train")
  446. func_wall                     : Changes texture to alternate texture when triggered
  447.  
  448. info_intermission             : Cameras positioning for intermission (?)
  449. info_notnull                  : Used as a positional target for lighting (does not remove itself)
  450. info_null                     : Used as a positional target for spotlights (removes itself)
  451. info_player_coop              : A coop player start (more than one allowed)
  452. info_player_deathmatch        : A deathmatch start (more than one allowed)
  453. info_player_start             : Main player starting point (only one allowed)
  454. info_player_start2            : Return point from episode
  455. info_teleport_destination     : Gives coords for a teleport destination using a targetname
  456.  
  457. All item_ keys may have a target key.  It triggers
  458. the event when the item is picked up.
  459.  
  460. item_armor1                   : Green armor
  461. item_armor2                   : Yellow armor
  462. item_armorInv                 : Red armor
  463. item_artifact_envirosuit      : Environmental Protection Suit
  464. item_artifact_invisibility    : Ring of Shadows (Invisibility)
  465. item_artifact_invulnerability : Penkeyram of Protection
  466. item_artifact_super_damage    : Quad Damage
  467. item_cells                    : Ammo for the Thunderbolt
  468. item_health                   : Medkit
  469. item_key1                     : Silver Key
  470. item_key2                     : Gold Key
  471. item_rockets                  : Ammo for Rocket/Grenade Launcher
  472. item_shells                   : Ammo for both Shotgun and SuperShotgun
  473. item_sigil                    : Sigil (a rune)
  474. item_spikes                   : Ammo for Perforator and Super Perforator
  475. item_weapon                   : Generic weapon class - DO NOT USE
  476.  
  477. light                         : A projected light. No visible lightsource.
  478. light_flame_large_yellow      : Large yellow fire (gives off light)
  479. light_flame_small_yellow      : Small yellow fire (gives off light)
  480. light_flame_small_white       : Small white fire  (gives off light)
  481. light_fluoro                  : A projected light. No visible lightsource. Makes humming sound.
  482. light_fluorospark             : A projected light. No visible lightsource. Makes broken, sparking
  483.                                 sound
  484. light_globe                   : Light that appears as a globe sprite
  485. light_torch_small_walltorch   : Small wall torch (gives off light)
  486.  
  487. monster_army                  : Grunt (30HP)
  488. monster_boss                  : Cthon - only can be killed by event_lightning
  489. monster_demon1                : Fiend [Demon] (300HP)
  490. monster_dog                   : Attack dog (25HP)
  491. monster_enforcer              : Enforcer (80HP)
  492. monster_fish                  : Rotfish (25HP)
  493. monster_hell_knight           : Hell Knight (250HP)
  494. monster_knight                : Knight (75HP)
  495. monster_ogre                  : Ogre (200HP)
  496. monster_ogre_marksman         : Ogre [synonymous with monster_ogre] (200HP)
  497. monster_oldone                : Shubb-Niggurath (40000HP) - requires a misc_teleportrain and
  498.                                 an info_intermission
  499. monster_shalrath              : Shalrath [Vore] (400HP)
  500. monster_shambler              : Shambler (600HP) - rockets 1/2 damage
  501. monster_tarbaby               : Spawn [Tarbaby] (80HP)
  502. monster_wizard                : Scragg [Wizard] (80HP)
  503. monster_zombie                : Zombie (60HP)
  504.  
  505. misc_explobox                 : Large Nuclear Container
  506. misc_explobox2                : Small Nuclear Container
  507. misc_fireball                 : Small fireball (gives off light, harms player)
  508. misc_noisemaker               : Makes lots of sounds (not very useful)
  509. misc_teleporttrain            : Spiked ball needed to telefrag monster_oldone
  510.  
  511. noclass                       : Prints a warning message when spawned and removes itself
  512.  
  513. path_corner                   : Used to define path of func_train platforms and of monsters
  514.  
  515. test_fodder                   : Testing only - DO NOT USE
  516. test_teleport                 : Teleporter Testing - DO NOT USE
  517.  
  518. trap_shooter                  : Fires nails without needing to be triggered.
  519. trap_spikeshooter             : Shoots spikes (nails)
  520.  
  521. trigger_changelevel           : Changes to another level
  522. trigger_counter               : Triggers action after it has been triggered count times.
  523. trigger_hurt                  : Hurts whatever touches the trigger
  524. trigger_monsterjump           : Causes triggering monster to jump in a direction
  525. trigger_multiple              : Triggers action (can be retriggered)
  526. trigger_once                  : Triggers action only once
  527. trigger_onlyregistered        : Triggers only if game is registered (registered == 1)
  528. trigger_push                  : Pushes a player in a direction (like a windtunnel)
  529. trigger_relay                 : Allows delayed/multiple actions from one trigger
  530. trigger_secret                : Triggers action and awards secret credit.
  531. trigger_setskill              : Changes skill level
  532. trigger_teleport              : Teleport (all trigger_ keys are triggered by walkover)
  533.  
  534. weapon_grenadelauncher        : Grenade Launcher
  535. weapon_lightning              : Lightning Gun
  536. weapon_nailgun                : Perforator
  537. weapon_rocketlauncher         : Rocket Launcher
  538. weapon_supernailgun           : Super Perforator
  539. weapon_supershotgun           : Super Shotgun
  540.  
  541.                      Section 3: Entity 'class' examples
  542.  
  543. 2.3.1 Lights
  544.  
  545. For all light-emmitting entities, spawnflags and style have special
  546. meanings:
  547.  
  548. Spawnflags:
  549. 0 - Light starts on.  Switches off when triggered.
  550. 1 - Light starts off.  Switches on when triggered.
  551.  
  552. Style:
  553. 0  - normal
  554. 1  - flicker (first variety)
  555. 2  - slow strong pulse
  556. 3  - candle (first variety)
  557. 4  - fast strobe
  558. 5  - gentle pulse
  559. 6  - flicker (second variety)
  560. 7  - candle (second variety)
  561. 8  - candle (third variety)
  562. 9  - slow strobe
  563. 10 - flourescent flicker
  564. 11 - slow pulse, not fading to black
  565.  
  566.    styles 32-62 are assigned by the light program for switchable lights
  567.  
  568. 63 - testing
  569.  
  570. Regular Light:
  571.  
  572. {
  573.     "classname" "light"
  574.     "origin" "X Y Z"    // Tells where the light is
  575.     "light" "#"         // Tells how bright the light is (optional - default 200)
  576.     "style" "#"         // How the light appears
  577.     "spawnflags" "#"    // State light starts in
  578.     "target" "#"        // What the light points at (optional - makes a spotlight)
  579.     "targetname" "#"    // Target id of the light
  580.  
  581.     "starts_off;quot;    // If present, light starts turned off
  582.  
  583. }
  584.  
  585. Fluorescent Light:
  586.  
  587. {
  588.     "classname" "light_fluoro"
  589.     "origin" "X Y Z"    // Tells where the light is
  590.     "light" "#"         // Tells how bright the light is (optional - default 200)
  591.     "style" "#"         // How the light appears
  592.     "spawnflags" "#"    // State light starts in
  593.     "targetname" "#"    // Target id of the light
  594. }
  595.  
  596. Fluorescent Light (makes sparking sound):
  597.  
  598. {
  599.     "classname" "light_fluorospark"
  600.     "origin" "X Y Z"    // Tells where the light is
  601.     "light" "#"         // Tells how bright the light is (optional - default 200)
  602.     "style" "#"         // How the light appears
  603.     "spawnflags" "#"    // State light starts in
  604.     "targetname" "#"    // Target id of the light
  605. }
  606.  
  607. Torches:
  608.  
  609. {
  610.     "classname" "light_torch_small_walltorch"
  611.     "origin" "X Y Z"    // Tells where the light is
  612.     "light" "#"         // Tells how bright the light is (optional - default 200)
  613.     "style" "#"         // How the light appears
  614.     "spawnflags" "#"    // State light starts in
  615.     "targetname" "#"    // Target id of the light
  616. }
  617.  
  618. Fire:
  619.  
  620. {
  621. "classname" "light_flame_large_yellow"
  622. "light" "#"         // Tells how bright the light is (optional)
  623. "origin" "X Y Z"
  624. }
  625.  
  626. {
  627. "classname" "light_flame_small_yellow, light_flame_small_white"
  628. "light" "#"         // Tells how bright the light is (optional)
  629. "origin" "X Y Z"
  630.  
  631. "starts_off"    // If present, light is off until triggered
  632. }
  633.  
  634. 2.3.2 Player Movement Entities
  635.  
  636. Level Change Trigger (attaches to brush):
  637.  
  638. {
  639.     "classname" "trigger_changelevel"
  640.     "map" "mapname"  // Map to change to on trigger; if not present, map is restarted
  641.     "spawnflags" "#" // Flags describing the object (optional)
  642.     "no_intermission"          // If present, intermission screen is skipped
  643.  
  644.     {
  645.         <INSERT MODEL INFO HERE>
  646.     }
  647.  
  648. }
  649.  
  650. Teleport Trigger (attaches to brush):
  651.  
  652. {
  653.     "classname" "trigger_teleport"
  654.     "target" "t#"     // Teleport destination name to teleport to.
  655.     "targetname" "t#" // if present, only teleports when triggered, not when touched (optional)
  656.  
  657.     "player_only"               // If present, only players can use teleport
  658.     "silent"       // If present, teleport makes no sound (broken in QuakeC; use spawnflags == 2)
  659.  
  660.     {
  661.         <INSERT MODEL INFO HERE>
  662.     {
  663.  
  664. }
  665.  
  666. Teleport Destination:
  667.  
  668. {
  669.     "classname" "info_teleport_destination"
  670.     "origin" "X Y Z"
  671.     "angle" "#"       // angle the player will face upon leaving teleport
  672.     "targetname" "t#" // Teleport's trigger name
  673. }
  674.  
  675. 2.3.3 Movers
  676.  
  677. Door (attaches to brush):
  678.  
  679. {
  680.     "classname" "func_door"
  681.     "angle" "#"      // opening angle
  682.     "speed" "#"      // speed of movement (100 default)(optional)
  683.     "targetname" "#" // Door's trigger name (optional)
  684.     "sounds" "#"     // sound it makes
  685.                      // 0 = no sound
  686.                      // 1 = stone
  687.                      // 2 = base
  688.                      // 3 = stone chain
  689.                      // 4 = screechy metal
  690.     "wait" "#"       // delay before closing (3 default, -1 never return) (optional)
  691.     "spawnflags" "#" // Flags describing the object (optional)
  692.     "lip" "#"        // amount remaining at end of move (8 default) (optional)
  693.     "message" "#"    // message printed if door is opened by trigger
  694.     "health" "#"     // if set, door must be shot open
  695.     "dmg" "#"        // damage inflicted on blocking entities
  696.  
  697.     "toggle"         // door waits in both open and closed states for trigger
  698.     "start_open"     // door starts open; when triggered, closes
  699.     "door_dont_link" // does not link action to multiple door brushes?
  700.     "gold_key"       // door requires a gold key to open
  701.     "silver_key"     // door requires a silver key to open
  702.  
  703.     {
  704.         <INSERT MODEL INFO HERE>
  705.     }
  706. }
  707.  
  708. Secret Door - automatically shootable:
  709.  
  710. {
  711.     "classname" "func_door_secret"
  712.     "angle" "#"      // angle it moves when activated
  713.     "speed" "#"      // speed of movement
  714.     "targetname" "#" // Door's trigger name
  715.     "sounds" "#"     // sound it makes
  716.     "wait" "#"       // delay before closing
  717.     "spawnflags" "#" // Flags describing the object (optional)
  718.     "lip" "#"        // some kind of offset (optional)
  719.  
  720.     "open_once"      // once open, stays open
  721.     "1st_left"       // first move is left of arrow
  722.     "1st_down"       // first move is down from arrow
  723.     "no_shoot"       // only opened by trigger
  724.     "always_shoot"   // even if targeted, keep shootable
  725.  
  726.     {
  727.         <INSERT MODEL INFO HERE>
  728.     }
  729. }
  730.  
  731. Just a regular wall, unless targeted, then changes texture to alternate texture.  Also useful for creating deathmatch/single-player only brushes. (attaches to brush):
  732.  
  733. {
  734.     "classname" "func_wall"
  735.     "spawnflags" "#" // difficulty level/mode brush appears/does not appear in.
  736.  
  737.     {
  738.         <INSERT MODEL INFO HERE>
  739.     }
  740. }
  741.  
  742. A platform (i.e. lift or elevator, attaches to brush)
  743.  
  744. note - The platform should be placed at its top position when
  745. you place it in your map.  The platform is lowered by the height
  746. key.  When the plat is stepped on, the plat raises to its original
  747. position.  To make a platform that starts out at its top position
  748. and lowers to the ground, use func_door:
  749.  
  750. {
  751.     "classname" "func_plat"
  752.     "height" "#" // determines amount plat moves manually (optional)
  753.     "speed" "#"  // moving speed (default:150)
  754.     "sounds" "#" // sound it makes (optional)
  755.                  // 1 = base fast
  756.                  // 2 = chain slow
  757.  
  758.     {
  759.         <INSERT MODEL INFO HERE>
  760.     }
  761. }
  762.  
  763. Moving platform (Attaches to brush):
  764.  
  765. {
  766.     "classname" "func_train"
  767.     "sounds" "#"      // Sound it makes when activated
  768.                       // 1 == ratchet metal
  769.     "speed" "#"       // Speed at which it moves (default:100)
  770.     "target" "t#"     // Trigger name of its first path_corner destination
  771.     "targetname" "t#" // Its trigger name
  772.     "dmg" "#"         // Damage done on crush (default:2)
  773.  
  774.     {
  775.         <INSERT MODEL INFO HERE>
  776.     }
  777. }
  778.  
  779. Describes path of train/monsters:
  780.  
  781. {
  782.     "classname" "path_corner"
  783.     "origin" "X Y Z"
  784.     "target" "t#"     // Trigger name of next train destination.
  785.     "targetname" "t#" // It's trigger name.
  786. }
  787.  
  788. Appears as solid wall, but can be walked through, light passes through:
  789.  
  790. {
  791.         "classname" "func_illusionary"
  792.  
  793.     {
  794.         <INSERT MODEL INFO HERE>
  795.     }
  796. }
  797.  
  798. 2.3.4 Triggers/Switches
  799.  
  800. A button/switch (attaches to brush):
  801.  
  802. {
  803.     "classname" "func_button"
  804.     "angle" "#"       // Angle button moves?
  805.     "speed" "#"       // Speed it moves in?
  806.     "target" "t#"     // Trigger name of target entity
  807.     "health" "#"      // If there is health, button is shootable
  808.     "killtarget" "#"  // Kills target when activated
  809.     "lip" "#"         // Amount button sticks out when activated (default:4)
  810.     "sounds" "#"      // Sound it makes when activated
  811.                       // 1 == Steam Metal
  812.                       // 2 == Wooden Clunk
  813.                       // 3 == Metallic Click
  814.                       // 4 == In-Out
  815.     "wait" "#"        // Wait until retrigger? (-1 stays pressed)
  816.     "delay" "#"       // Delay before action is triggered
  817.  
  818.     {
  819.         <INSERT MODEL INFO HERE>
  820.     }
  821. }
  822.  
  823. Trigger - removes itself when triggered:
  824.  
  825. {
  826.     "classname" "trigger_once"
  827.     "killtarget" "t#" // Kills something [for triggering monster events] (optional)
  828.     "target" "t#"     // Trigger name of target
  829.     "sounds" "#"      // Sound made when triggered
  830.                       // 1 == Secret Sound
  831.                       // 2 == Beep Beep
  832.                       // 3 == Large Switch
  833.                       // 4 == Set "message" to text string
  834.     "delay" "#"       // Delay before action is triggered
  835.     "health" "#"      // if > 1, must be killed to trigger, if == 0, walk-over trigger
  836.     "message" "#"     // String displayed when triggered
  837.  
  838.     "notouch"         // Only triggered by other entities, not by touching
  839.  
  840.     {
  841.         <INSERT MODEL INFO HERE>
  842.     }
  843. }
  844.  
  845. Trigger - can be triggered multiple times:
  846.  
  847. {
  848.     "classname" "trigger_multiple"
  849.     "killtarget" "t#" // Kills something [for triggering monster events] (optional)
  850.     "target" "t#"     // Trigger name of target
  851.     "sounds" "#"      // Sound made when triggered
  852.                       // 1 == Secret Sound
  853.                       // 2 == Beep Beep
  854.                       // 3 == Large Switch
  855.                       // 4 == Set "message" to text string
  856.     "wait" "#"        // Delay before retrigger
  857.     "delay" "#"       // Delay before action is triggered
  858.     "health" "#"      // if > 1, must be killed to trigger, if == 0, walk-over trigger
  859.     "message" "#"     // String displayed when triggered
  860.  
  861.     "notouch"         // Only triggered by other entities, not by touching
  862.  
  863.     {
  864.         <INSERT MODEL INFO HERE>
  865.     }
  866. }
  867.  
  868. Trigger - only triggers if console variable registered == 1:
  869.  
  870. {
  871.     "classname" "trigger_onlyregistered"
  872.     "killtarget" "t#" // Kills something [for triggering monster events] (optional)
  873.     "target" "t#"     // Trigger name of target
  874.     "sounds" "#"      // Sound made when triggered
  875.                       // 1 == Secret Sound
  876.                       // 2 == Beep Beep
  877.                       // 3 == Large Switch
  878.                       // 4 == Set "message" to text string
  879.     "delay" "#"       // Delay before action is triggered
  880.     "health" "#"      // if > 1, must be killed to trigger, if == 0, walk-over trigger
  881.     "message" "#"     // String displayed when registered == 0
  882.  
  883.     "notouch"         // Only triggered by other entities, not by touching
  884.  
  885.     {
  886.         <INSERT MODEL INFO HERE>
  887.     }
  888. }
  889.  
  890. Walk-over trigger - can be triggered multiple times:
  891.  
  892. {
  893.     "classname" "trigger_secret"
  894.     "killtarget" "t#" // Kills something [for triggering monster events] (optional)
  895.     "target" "t#"     // Trigger name of target
  896.     "sounds" "#"      // Sound made when triggered
  897.                       // 1 == Secret Sound
  898.                       // 2 == Beep Beep
  899.     "wait" "#"        // Delay before retrigger
  900.     "delay" "#"       // Delay before action is triggered
  901.     "health" "#"      // if > 1, must be killed to trigger, if == 0, walk-over trigger
  902.     "message" "#"     // String displayed when triggered
  903.  
  904.     "notouch"         // Only triggered by other entities, not by touching
  905.  
  906.     {
  907.         <INSERT MODEL INFO HERE>
  908.     }
  909. }
  910.  
  911. Triggers target after it is triggered count times:
  912.  
  913. {
  914.     "classname" "trigger_counter"
  915.     "targetname" "t#" // Its trigger name
  916.     "target" "t#"     // Trigger name of its target
  917.     "count" "#"       // Decrements on each trigger.  When 0 activates target.
  918.     "wait" "#"        // Required delay before retrigger
  919.     "delay" "#"       // Delay before action is triggered
  920.  
  921.     "nomessage"       // If present, no message will be displayed when triggered.
  922.     {
  923.         <INSERT MODEL INFO HERE>
  924.     }
  925. }
  926.  
  927. Used to stagger events on a trigger:
  928.  
  929. {
  930.     "classname" "trigger_relay"
  931.     "origin" "X Y Z"  // Where it is located
  932.     "killtarget" "#"  // Removes targeted entity (optional)
  933.     "targetname" "t#" // Its trigger name
  934.     "target" "t#"     // Trigger name of its target
  935.     "delay" "#"       // Delay before action is triggered
  936. }
  937.  
  938. Makes a monster jump when it reaches a brush:
  939.  
  940. {
  941.     "classname" "trigger_monsterjump"
  942.     "speed" "#"       // Forward velocity of the monster jump
  943.     "height" "#"      // How high the monster jumps
  944.     "angle" "#"       // Angle towards which the monster jumps
  945.  
  946.     {
  947.         <INSERT MODEL INFO HERE>
  948.     }
  949. }
  950.  
  951. Damages whatever touches the brush:
  952.  
  953. {
  954.     "classname" "trigger_hurt"
  955.     "dmg" "#"       // Damage done to touching entity
  956.  
  957.     {
  958.         <INSERT MODEL INFO HERE>
  959.     }
  960. }
  961.  
  962. Pushes the player in a direction:
  963.  
  964. {
  965.     "classname" "trigger_push"
  966.     "origin" "X Y Z"  // Where it is located
  967.     "speed" "#"       // Force of the push
  968.     "angle" "#"       // Direction player is pushed towards (-1=up -2=down, other=normal)
  969.  
  970.     "push_once"       // Pushes once, then removes itself
  971. }
  972.  
  973. 2.3.5 Traps/Things harmful to you:
  974.  
  975. Triggerable Nail-firing trap:
  976.  
  977. {
  978.     "classname" "trap_spikeshooter"
  979.     "origin" "X Y Z"
  980.     "angle" "#"       // Angle the trap fires at
  981.     "targetname" "t#" // Trap's trigger name
  982.     "spawnflags" "#"  // ??? 1024 works
  983.  
  984.     "superspike"      // If present, fires large spikes
  985.     "laser"           // If present, fires lasers
  986. }
  987.  
  988. Constant Nail-firing trap:
  989.  
  990. {
  991.     "classname" "trap_shooter"
  992.     "origin" "X Y Z"
  993.     "angle" "#"       // Angle the trap fires at
  994.     "wait" "#"        // Time between shots
  995.     "spawnflags" "#"  // ??? 1024 works
  996.     "nextthink" "#"   // Delay before firing first spike (so shots can be skeygered)
  997.  
  998.     "superspike"      // If present, fires large spikes
  999.     "laser"           // If present, fires lasers
  1000. }
  1001.  
  1002. Fireballs:
  1003.  
  1004. {
  1005.     "classname" "misc_fireball"
  1006.     "origin" "X Y Z"
  1007.     "speed" "#" // Tells how fast the fireball moves
  1008. }
  1009.  
  1010. 2.3.6 Miscellaneous:
  1011.  
  1012. Cameras for the intermission screen:
  1013.  
  1014. {
  1015.     "classname" "info_intermission"
  1016.     "origin" "X Y Z" // location of camera
  1017.     "mangle" "X Y Z" // location the camera looks at
  1018.     "angle" "#"      // angle of the camera
  1019. }
  1020.  
  1021. Setting difficulty level (attaches to brush):
  1022.  
  1023. {
  1024.     "classname" "trigger_setskill"
  1025.     "message" "#"   // Skill level to change to.
  1026.                     // 0 == easy
  1027.                     // 1 == normal
  1028.                     // 2 == hard
  1029.                     // 3 == nightmare
  1030.     {
  1031.         <INSERT MODEL INFO HERE>
  1032.     }
  1033. }
  1034.  
  1035. Lightning used to kill the boss of shareware.  I'll figure out how to use
  1036. it later...  I pretty much know how, I just want to test it before I
  1037. put it here :).  From the testing I've done, the lightning produced will
  1038. not damage a player, however.  It probably triggers a script to give the
  1039. boss character damage.
  1040.  
  1041. {
  1042.     "classname" "event_lightning"
  1043.     "origin" "X Y Z"  // location of lightning (origin?)
  1044.     "targetname" "t#" // It's trigger name
  1045. }
  1046.  
  1047.                          Section 4: Level Structures
  1048.  
  1049. 2.4.1 Moving Platforms:
  1050.  
  1051. Creating a moving platform isn't that difficult.  First, you must define the
  1052. brush that will do the moving.  Here's an example:
  1053.  
  1054. {
  1055. "classname" "func_train"
  1056. "sounds" "1"
  1057. "speed" "128"
  1058. "target" "t1dest1"
  1059. "targetname" "t1"
  1060.     {
  1061.         ( -768 0 0 ) ( -768 1 0 ) ( -768 0 1 ) GROUND1_6 0 0 0 1.0 1.0
  1062.         ( -640 0 0 ) ( -640 0 1 ) ( -640 1 0 ) GROUND1_6 0 0 0 1.0 1.0
  1063.         ( 0 -384 0 ) ( 0 -384 1 ) ( 1 -384 0 ) GROUND1_6 0 0 0 1.0 1.0
  1064.         ( 0 -256 0 ) ( 1 -256 0 ) ( 0 -256 1 ) GROUND1_6 0 0 0 1.0 1.0
  1065.         ( 0 0 -256 ) ( 1 0 -256 ) ( 0 1 -256 ) GROUND1_6 0 0 0 1.0 1.0
  1066.         ( 0 0 -128 ) ( 0 1 -128 ) ( 1 0 -128 ) GROUND1_6 0 0 0 1.0 1.0
  1067.     }
  1068. }
  1069.  
  1070. Now you define each of the path_corners it will travel to.  When it reaches
  1071. a path_corner, it will float to the next path_corner defined in the target
  1072. key of the path_corner.  The platform will start at the path_corner pointed
  1073. to by the platform's target key.  It will continue the loop indefinitely until
  1074. it reaches a path_corner with a wait key equal to -1.  The platform will go
  1075. through walls to get to its destination.  Here is what its path_corners would
  1076. look like:
  1077.  
  1078. {
  1079. "classname" "path_corner"
  1080. "origin" "0 0 0"
  1081. "targetname" "t1dest1"
  1082. "target"" "t1dest2"
  1083. }
  1084.  
  1085. {
  1086. "classname" "path_corner"
  1087. "origin" "0 128 0"
  1088. "targetname" "t1dest2"
  1089. "target"" "t1dest1"
  1090. }
  1091.  
  1092. 2.4.2 Monsters and Triggers:
  1093.  
  1094. *NEW INFO*: Method may be broken.  trigger_counter may be required for it to properly work
  1095.  
  1096. Have you been wondering how you can get events to trigger when a monster dies, as first
  1097. seen in E1M2 with the demons?  Well, it's not too difficult.  When you attach a
  1098. target key to a monster, the monster's death will trigger the event.  I believe
  1099. (not tested) that if other monsters have a targetname key the same as a monster
  1100. with the target key, the target event will only occur when all monsters with
  1101. a matching targetname key are dead.  The monster with the target key need not
  1102. have the targetname key.
  1103.  
  1104. 2.4.3 How to use trigger_count:
  1105.  
  1106. The trigger_count class is quite an interesting trigger. You know of the
  1107. area in E1M1 where you have to hit the three switches to open the door?
  1108. Well, that's done using a trigger_counter. Each of the buttons you hit has
  1109. its target property set so it points to a trigger_counter. The
  1110. trigger_counter has its count key set to three. Each time a switch is hit,
  1111. the trigger_counter's count property will decrement by one. When it reaches
  1112. zero, it will open the door. Each button can only be triggered once as it
  1113. has a wait of -1. Here's an example given to me by Remco Stoffer:
  1114.  
  1115. {
  1116.  "classname"    "func_door"
  1117.  "targetname"    "door2"
  1118.  "target"        "light1"
  1119.  "angle"        "-1"
  1120.  "wait" "-1"
  1121.  "sounds" "4"
  1122.  "message"   "press all buttons"
  1123.  {
  1124.   ( -10  120    0 ) ( -10   80    0 ) (  10  120    0 ) *slime0 2 0 0 1.000000 1.000000
  1125.   (  10   80    0 ) (   0   80  100 ) ( -10  120    0 ) *slime0 2 0 0 1.000000 1.000000
  1126.   (   0   80  100 ) ( -10   80    0 ) (   0  120  100 ) *slime0 2 0 0 1.000000 1.000000
  1127.   ( -10   80    0 ) (  10   80  100 ) (  10   80    0 ) *slime0 2 0 0 1.000000 1.000000
  1128.  }
  1129. }
  1130. {
  1131.  "classname"      "trigger_counter"
  1132.  "count"          "3"
  1133.  "targetname"     "door1"
  1134.  "target"         "door2"
  1135.  "wait"           "-1"
  1136. }
  1137. {
  1138.  "classname"      "func_button"
  1139.  "angle"          "0"
  1140.  "wait"           "-1"
  1141.  "target"         "door1"
  1142.  {
  1143.   (  180 -200   50 ) (  180 -180   50 ) (  200 -180   50 ) tlight11 16 0 0 1.000000 1.000000
  1144.   (  180 -200   30 ) (  200 -200   30 ) (  200 -180   30 ) tlight11 16 0 0 1.000000 1.000000
  1145.   (  200 -180   50 ) (  180 -180   50 ) (  200 -180   30 ) tlight11 16 0 0 1.000000 1.000000
  1146.   (  180 -180   50 ) (  180 -200   50 ) (  180 -180   30 ) tlight11 16 0 0 1.000000 1.000000
  1147.   (  180 -200   50 ) (  200 -200   50 ) (  180 -200   30 ) tlight11 16 0 0 1.000000 1.000000
  1148.   (  200 -200   50 ) (  200 -180   50 ) (  200 -200   30 ) tlight11 16 0 0 1.000000 1.000000
  1149.  }
  1150. }
  1151. {
  1152.  "classname"      "func_button"
  1153.  "angle"          "0"
  1154.  "wait"           "-1"
  1155.  "target"         "door1"
  1156.  {
  1157.   (  180 -10    50 ) (  180  10    50 ) (  200  10    50 ) +0basebtn 0 0 0 1.000000 1.000000
  1158.   (  180 -10    30 ) (  200 -10    30 ) (  200  10    30 ) +0basebtn 0 0 0 1.000000 1.000000
  1159.   (  200  10    50 ) (  180  10    50 ) (  200  10    30 ) +0basebtn 0 0 0 1.000000 1.000000
  1160.   (  180  10    50 ) (  180 -10    50 ) (  180  10    30 ) +0basebtn 0 0 0 1.000000 1.000000
  1161.   (  180 -10    50 ) (  200 -10    50 ) (  180 -10    30 ) +0basebtn 0 0 0 1.000000 1.000000
  1162.   (  200 -10    50 ) (  200  10    50 ) (  200 -10    30 ) +0basebtn 0 0 0 1.000000 1.000000
  1163.  }
  1164. }
  1165. {
  1166.  "classname"      "func_button"
  1167.  "angle"          "0"
  1168.  "wait"           "-1"
  1169.  "target"         "door1"
  1170.  {
  1171.   (  180  180   50 ) (  180  200   50 ) (  200  200   50 ) +0basebtn 0 0 0 1.000000 1.000000
  1172.   (  180  180   30 ) (  200  180   30 ) (  200  200   30 ) +0basebtn 0 0 0 1.000000 1.000000
  1173.   (  200  200   50 ) (  180  200   50 ) (  200  200   30 ) +0basebtn 0 0 0 1.000000 1.000000
  1174.   (  180  200   50 ) (  180  180   50 ) (  180  200   30 ) +0basebtn 0 0 0 1.000000 1.000000
  1175.   (  180  180   50 ) (  200  180   50 ) (  180  180   30 ) +0basebtn 0 0 0 1.000000 1.000000
  1176.   (  200  180   50 ) (  200  200   50 ) (  200  180   30 ) +0basebtn 0 0 0 1.000000 1.000000
  1177.  }
  1178. }
  1179.  
  1180. 2.4.4 Teleporting Monsters:
  1181.  
  1182. Unlike in Doom-Engine games, you can precisely teleport monsters into new
  1183. locations in Quake. To do so, you must first create a out of reach area for
  1184. the monsters to reside in. Give this area a trigger_teleport key and assign
  1185. a targetname key to it. Create a teleport_destination where you want the
  1186. monster to appear. Now, you must create a trigger whose target property
  1187. points to the trigger_teleport's targetname. When this trigger is activated,
  1188. the monster in the room will teleport to the teleport_destination. Make sure
  1189. that there is only one monster per room and one room per
  1190. teleport_destination. Otherwise, when the teleport is triggered, all the
  1191. monsters will telefrag each other (like what happens in E1M7 when you win).
  1192.  
  1193. 2.4.5 Properties of Buttons:
  1194.  
  1195. The behavior of buttons can be altered in many ways. By default, buttons are
  1196. activated by pressing them (moving near them). Buttons can be made shootable
  1197. by giving them a health key. Unless you want to have to shoot the button
  1198. tons of times, set the health key to "1". If you want to have the button
  1199. flash when you shoot it, you must include all of the button animation
  1200. textures in the level. You can just put them on brushes outside the level.
  1201. On a shootable button, you should use one of the special textures designed
  1202. for shootable buttons that changes appearance when the button is
  1203. activated/deactivated. These are the +?shoot textures, and both frames of
  1204. the texture must be present in the level for the texture on the button to
  1205. change when its state is changed.
  1206.  
  1207. 2.4.6 Including predefined models:
  1208.  
  1209. It is possible to substitute inclusion of actual model definitions with a
  1210. key that defines a model definiton that has already been declared previously
  1211. in the map file. This is possible by using the model key. Usually, this key
  1212. is used only by QBSP in a compiled BSP file, but it can also be used in a
  1213. map file to directly include the model that belongs to a previously defined
  1214. entity. Here's the general syntax:
  1215.  
  1216. { "classname" "origin" "model" "*#" }
  1217.  
  1218. where '#' is the number of the model being included
  1219.  
  1220. The origin key in this instance acts as an offset to the model, moving it
  1221. from its original position to the position defined by the origin key's
  1222. value. The model key directly substitutes for an inline model declaration.
  1223. There are several limitations with this approach, however. First, the model
  1224. being included must be precached. This means that either custom QuakeC progs
  1225. are required for the level to be usable within Quake, or the model being
  1226. included must have previously been defined within the map file. The second
  1227. limitiation is that the number of the models of previously defined entities
  1228. directly corresponds with their position within the map file - for example,
  1229. the first defined entity with an inline model definition is model 0, the
  1230. second entity with an inline model declaration is model 1 and so on. This
  1231. means that any insertations of new models before a model that is used in a
  1232. non-inline declaration will change the numbering scheme and therefore cause
  1233. the level to not function as intended.
  1234.  
  1235.                   Appendix A: Algorithms and Code Examples
  1236.  
  1237. A.1.1 Introduction:
  1238.  
  1239. **SECTION UNDER CONSTRUCTION**
  1240.  
  1241. Quake is one of the most mathematically demanding games currently out at this time.  This means that creating utilities
  1242. to deal with Quake's data and levels requires a much better understanding of mathematical concepts than what other
  1243. games do.  Thus, I've put together a list of algorithms useful in dealing with map data.  This should save you from
  1244. having to find these from mathematical textbooks and handbooks, and also from having to derive these equations into
  1245. a form that is useful.  All of the equations here were taken from my QMapEd Quake Map Editor project.
  1246.  
  1247. You'll need to know a few things before you can use the algorithms I present here.  First, I'm talking in C here - and
  1248. if you don't know C, too bad.  I can't write to every language out there.  I also assume that you have a basic
  1249. understanding of space analytic geometry, vectors, and matrix equations.  If you don't, this stuff probably won't make
  1250. any sense.  Here are the two equations I use to describe a plane:
  1251.  
  1252. normal form:  ax + by + yz = n
  1253. general form: Ax + By + Cz + D = 0
  1254.  
  1255. Both of these equations share common relationships:
  1256.  
  1257. a = A
  1258. b = B
  1259. c = C
  1260. n = -D
  1261.  
  1262. Most of the original equations here were obtained from Engineering Mathematics Handbook by Jan J. Tuma, Ph.D.
  1263.  
  1264. A.2.1 Plane Passing through Three Points:
  1265.  
  1266. The following formula will give you the equation of a plane (in normal form) from three noncolinear points.  Here's the
  1267. equation in matrix form:
  1268.  
  1269. Points: Pi, Pj, Pk - (x,y,z)
  1270.  
  1271. [yi zi 1]    [zi xi 1]    [xi yi 1]    [xi yi zi]
  1272. [yj zj 1]x + [zj xj 1]y + [xj yj 1]z = [xj yj zj]
  1273. [yk zk 1]    [zk xk 1]    [xk yk 1]    [xk yk zk]
  1274.  
  1275. That may look simple, but the equation is not very useful in that form.  Before the equation can be use, the matrices
  1276. must be expanded.  Then, you must solve for d, a, b, and c.  Fortunately for you, I've already done the work - it's
  1277. rather long though, so be ready.
  1278.  
  1279. structures:
  1280.  
  1281. typedef struct
  1282. {
  1283. double x;
  1284. double y;
  1285. double z;
  1286. } point;
  1287.  
  1288. variables:
  1289.  
  1290. point p1 == Pi
  1291. point p2 == Pj
  1292. point p3 == Pk
  1293.  
  1294. equations:
  1295.  
  1296. I'm going to add a new eq using dot/cross products soon.  This one is rather lame
  1297. and untested.
  1298.  
  1299. d = -(( p1.pt.y*(p2.pt.z-p3.pt.z) - p2.pt.y*(p1.pt.z-p3.pt.z) + p3.pt.y*(p1.pt.z-p2.pt.z) ) +
  1300.      ( p1.pt.z*(p2.pt.x-p3.pt.x) - p2.pt.z*(p1.pt.x-p3.pt.x) + p3.pt.z*(p1.pt.x-p2.pt.x) ) +
  1301.      ( p1.pt.x*(p2.pt.y-p3.pt.y) - p2.pt.x*(p1.pt.y-p3.pt.y) + p3.pt.x*(p1.pt.y-p2.pt.y) ));
  1302.  
  1303. a = -((-(p1.pt.x*(p2.pt.y*p3.pt.z-p3.pt.y-p2.pt.z) - p2.pt.x*(p1.pt.y*p3.pt.z-p3.pt.y*p1.pt.z) +
  1304.      p3.pt.x*(p1.pt.y*p2.pt.z-p2.pt.y*p1.pt.z)))+
  1305. ( p1.pt.z*(p2.pt.x-p3.pt.x) - p2.pt.z*(p1.pt.x-p3.pt.x) + p3.pt.z*(p1.pt.x-p2.pt.x) ) +
  1306. ( p1.pt.x*(p2.pt.y-p3.pt.y) - p2.pt.x*(p1.pt.y-p3.pt.y) + p3.pt.x*(p1.pt.y-p2.pt.y) ));
  1307.  
  1308. b = -((-(p1.pt.x*(p2.pt.y*p3.pt.z-p3.pt.y-p2.pt.z) - p2.pt.x*(p1.pt.y*p3.pt.z-p3.pt.y*p1.pt.z) +
  1309.      p3.pt.x*(p1.pt.y*p2.pt.z-p2.pt.y*p1.pt.z)))+
  1310. ( p1.pt.y*(p2.pt.z-p3.pt.z) - p2.pt.y*(p1.pt.z-p3.pt.z) + p3.pt.y*(p1.pt.z-p2.pt.z) ) +
  1311. ( p1.pt.x*(p2.pt.y-p3.pt.y) - p2.pt.x*(p1.pt.y-p3.pt.y) + p3.pt.x*(p1.pt.y-p2.pt.y) ));
  1312.  
  1313. c = -((-(p1.pt.x*(p2.pt.y*p3.pt.z-p3.pt.y-p2.pt.z) - p2.pt.x*(p1.pt.y*p3.pt.z-p3.pt.y*p1.pt.z) +
  1314.      p3.pt.x*(p1.pt.y*p2.pt.z-p2.pt.y*p1.pt.z)))+
  1315. ( p1.pt.y*(p2.pt.z-p3.pt.z) - p2.pt.y*(p1.pt.z-p3.pt.z) + p3.pt.y*(p1.pt.z-p2.pt.z) ) +
  1316. ( p1.pt.z*(p2.pt.x-p3.pt.x) - p2.pt.z*(p1.pt.x-p3.pt.x) + p3.pt.z*(p1.pt.x-p2.pt.x) ));
  1317.  
  1318. A.2.2 Intersection of Three Planes:
  1319.  
  1320. The following formula will give you the point of intersection of three planes.  Here's the
  1321. equation in matrix form:
  1322.  
  1323.       [D1 B1 C1]
  1324.       [D2 B2 C2]
  1325.       [D3 B3 C3]
  1326. x = - ----------
  1327.       [A1 B1 C1]
  1328.       [A2 B2 C2]
  1329.       [A3 B3 C3]
  1330.  
  1331.       [A1 D1 C1]
  1332.       [A2 D2 C2]
  1333.       [A3 D3 C3]
  1334. y = - ----------
  1335.       [A1 B1 C1]
  1336.       [A2 B2 C2]
  1337.       [A3 B3 C3]
  1338.  
  1339.       [A1 B1 D1]
  1340.       [A2 B2 D2]
  1341.       [A3 B3 D3]
  1342. z = - ----------
  1343.       [A1 B1 C1]
  1344.       [A2 B2 C2]
  1345.       [A3 B3 C3]
  1346.  
  1347.  Derive it yourself for now - I haven't yet had time to derive it into code.
  1348.  
  1349.                                   Glossary
  1350.  
  1351. brush       - a solid region defined by the intersection of planes
  1352. entity      - an object that defines the properties an object in Quake; defines the way in which the
  1353.                      object should be handled in the QuakeC code
  1354. flag        - a key that does not require a value and is automatically translated into a spawnflag
  1355.                      parameter by QBSP
  1356. key         - a field of an entity that contains a value that affects the entity's characteristics
  1357. model       - a set of brushes all defined in one block
  1358. noncolinear - not lying on the same line
  1359. normal      - a line perpendicular to a plane
  1360. plane       - the set of all points in a two-dimensional region
  1361. point       - a specific zero-dimensional position in space
  1362. value       - the data assigned to a key
  1363.  
  1364. ----------------------------------------------------------------------------
  1365.  
  1366. The Quake Map Specs are ⌐1996 Nicholas Kain. Quake is ⌐1996 id Software.
  1367. Some information about entities was obtained from the Unofficial Quake
  1368. Specs, a truly awesome reference guide to Quake editing.
  1369.  
  1370. Disclaimer: This document is provided as is and may not be perfect. I do not
  1371. guarentee the validity of any of the information in it. I will not be held
  1372. liable or responsible for any damages caused from use or misuse of the
  1373. information contained within this document.
  1374.